package ModelAndController;
/*
 Az oszcilloszkóp hálózati elemet megvalósító osztály. 
 Az egyetlen bemenetén észlelt egy ütemezési ciklusban kapott logikai értéket 
 és az eddig elért stabil állapotokat  jeleníti meg, 1/0 formában.
  */
import java.util.ArrayList;

//Exception 300 es 319 kozott
public class Scope extends Element{
	//Az oszcilloszkóp stabil állapotait tároló tömb
	int[] state;
	int lastStateIndex;
	//Az oszcilloszkóp utolsó ütemezési ciklusban elért állapotait tároló tömb
	ArrayList<Integer> deltaArray;
	//konstruktor
	public Scope(){
		state = new int[1];
		state[0] = 0;
		deltaArray = new ArrayList<Integer>();
	}
	//Az elem belső állapotának változását végzi a bemenetek értékének függvényében.
	//Ha az adott elem változott, akkor azt jelzi a visszatérési értéken.
	public boolean isUpdateSuccess() throws Exception{
		boolean retValue = false;
		int newState = inputWires[0].getState();
		
		if( newState == -1)
			newState = 0;
		
		deltaArray.add( newState );
		
		buffer = Integer.toString( newState );
		return retValue;
	}
	//A delta tömb törlése
	public void clearDelta(){
		deltaArray.clear();
	}
	//Az ütemezési ciklus során elért utolsó állapotot a stabil állapotok közé veszi
	public void finalizeSchedule(){
		int newStableValue = deltaArray.get( deltaArray.size()-1 );
		addNewStableValueToState(newStableValue);
	}
	//Az ütemezési ciklus során elért utolsó állapotot a stabil állapotok közé veszi
	private void addNewStableValueToState(int newStableValue){
		int temp[] = state.clone();
		state = new int[ temp.length+1 ];
		for(int act=0; act<temp.length; act++)
			state[act] = temp[act];
		state[ temp.length ] = newStableValue;
		lastStateIndex = temp.length;
	}
	//Az elem stabil állapotainak értékeit adja vissza.	
	public int[] getState(){
		return state;
	}
	//Az elem utolsó ütemezési ciklusban elért állapotait adja vissza.	
	public int[] getDelta() {
		int delta[] = new int[ deltaArray.size() ];
		
		for(int act=0; act<deltaArray.size(); act++)
			delta[act] = deltaArray.get( act );
		
		return delta;
	}
	//Scope nem redelkezhet kimenettel,hibát dob
	public void setOutputNumbers(int nbOfOutput) throws Exception{
		if(nbOfOutput != 0)
			throw new Exception("300");
	}
	//Scope nem redelkezhet kimenettel,hibát dob
	public void setOutputWireNumbers(int actOutput, int nbOfOutputWires) throws Exception{
		throw new Exception("300");	
	}
	//Scope nem redelkezhet kimenettel,hibát dob
	public void setActualOutputWire(int actOutput, int nbOfWire, Wire act) throws Exception{
		throw new Exception("300");
	}

	//Scope állapota tömbben tárolódik
	public int getState(int nbOfOutput) throws Exception {
		return 0;
	}
	
}
